

class Pessoa:

    def __init__(self,nome,idade,sexo): # METODO CONSTRUTOR
        self.__nome = nome              # __atribudo SIGNIFICA QUE O ATRIBUTO FOI ENCAPSULADO
        self.__idade = idade     
        self.__sexo = sexo
        self.__mae = None
        self.__pai = None
        self.__filho = []                # LISTA VAZIA ONDE FICARAO GUARDADOS OS FILHOS
        self.__conjuge = None


    def setNome(self,nome):
        self.__nome = nome

    def setIdade(self,idade):
        self.__idade = idade

    def setSexo(self,sexo):              # DEFININDO OS METODOS "SET" E "GET"
        self.__sexo = sexo

    def setPai(self,pai):
        self.__pai = pai

    def setMae(self,mae):
        self.__mae = mae

    def setConjuge(self,conjuge):
        self.__conjuge = conjuge

    def setFilho(self,filho):
        self.__filho.append(filho)      # ADICIONA UM FILHO A LISTA

    def getNome(self):
        return self.__nome

    def getIdade(self):
        return self.__idade

    def getSexo(self):
        return self.__sexo

    def getPai(self):
        return self.__pai

    def getMae(self):
        return self.__mae

    def getConjuge(self):
        return self.__conjuge

    def getFilho(self):
        return self.__filho               # RETORNA A LISTA COM FILHOS

    
    def casar(self,Pessoa2):                                                    # METODO PARA CASAR PESSOAS
        if self.getConjuge() == None and Pessoa2.getConjuge() == None:          # Verifica se ja nao sao casados;
            if self.getSexo() != Pessoa2.getSexo():                             # se possuem sexos diferentes;
                if self.getIdade() >= 18 and Pessoa2.getIdade() >= 18:          # se sao maiores de idade.
                    self.setConjuge(Pessoa2)                                    # Executa casamento.
                    Pessoa2.setConjuge(self)
                else:
                    print "Menores de 18 anos nao podem casar!"
            else:
                print "Pessoas do mesmo sexo nao pdem se casar!"
        else:
            print "Pessoas so podem se casar uma vez!"


    def ter_filho(self,nome,idade,sexo):           # METODO PARA TER FILHOS
        if self.getConjuge() != None:
            filho = Pessoa(nome,idade,sexo)
            if self.getSexo() == "M":
                filho.setPai(self)
                filho.setMae(self.getConjuge())
            else:
                filho.setPai(self.getConjuge())
                filho.setMae(self)
            self.setFilho(filho)
            self.getConjuge().setFilho(filho)
            R = filho
        else:
            print "Somente pessoas casadas podem ter filhos!"
            R = None
        return R


    def nomePai(self):
        if self.getPai() != None:
            print "O nome do pai desta pessoa eh %s." %(self.getPai().getNome())
        else:
            print "Essa pessoa nao possui pai."

    def nomeMae(self):
        if self.getMae() != None:
            print "O nome da mae desta pessoa eh %s." %(self.getMae().getNome())
        else:
            print "Essa pessoa nao possui mae."

    def nomeFilho(self):
        if self.getFilho() != None:
            print "Essa pessoa possui o(s) seguinte(s) filho(s):"
            for i in self.getFilho():
                print i.getNome()
        else:
            print "Essa pessoa nao possui filhos"

    def nomeIrmao(self):
        if len(self.getPai().getFilho()) > 1:
            print "Essa pessoa possui o(a)(s) seguinte(s) irmao(a)(s):"
            for i in self.getPai().getFilho():
                if i != self:
                    print i.getNome()
        else:
            print "Essa pessoa nao possui irmao(a)(s)."

    def nomeNeto(self):
        if self.getFilho != []:
            print "Essa pessoa possui o(a)(s) seguintes neto(a)(s):"
            for i in self.getFilho():
                if i.getFilho() != []:
                    for j in i.getFilho():
                        print j.getNome()

    def nomeTio(self):
        if len(self.getPai().getPai().getFilho()) > 1:
            print "Essa pessoa possui o(a)(s) seguintes tio(a)(s)"
            for i in self.getPai().getPai().getFilho():
                if i != self.getPai():
                    print i.getNome()
        else:
            print "Essa pessoa nao possui tio(a)(s)."

    def nomePrimo(self):
        if len(self.getPai().getPai().getFilho()) > 1:
            print "Essa pessoa possui o(a)(s) seguintes primo(a)(s):"
            for i in self.getPai().getPai().getFilho():
                if i != self.getPai():
                    if i.getFilho() != []:
                        for j in i.getFilho():
                            print j.getNome()
        


class Familia:
    def __init__(self):
        self.P1 = None
        self.P2 = None
        self.P3 = None
        self.P4 = None
        self.P5 = None
        
    def criar_arvore(self):        
        self.P1 = Pessoa("Joao",20,"M")
        self.P2 = Pessoa("Maria",18,"F")
        self.P1.casar(self.P2)
        self.P3 = self.P1.ter_filho("Antonio",3,"M")
        self.P4 = self.P1.ter_filho("Julio",3,"M")
        self.P5 = self.P1.ter_filho("Mariana",3,"F")


                
        


            
                
                
            
        

        

    
    
                    
